
/**
 * 方式一：单纯的使用koa-router来编写restful API
*/
// import Koa from 'koa'
// import router from './routes/index'
// // 实例化koa
// const app: Koa = new Koa()
// app.use(async (ctx: Koa.DefaultContext, next: Koa.Next) => {
//   ctx.body = 'wahehe'
//   await next()
// })
// // 启动路由
// app.use(router.routes())
// app.use(router.allowedMethods())
// // 监听端口
// app.listen(3002, () => {
//   console.log('server is running at port 3002')
// })


/**
 * 方式二：使用koa-ts-controllers + koa-router来实现restful API
 */
import Koa from 'koa'
import KoaRouter from 'koa-router'
// 解析请求体
const koaBody = require('koa-body')
import { bootstrapControllers as KoaControllers } from 'koa-ts-controllers'
// 实例化koa
const app: Koa = new Koa()
const router: KoaRouter = new KoaRouter()
// 自定义控制台输出颜色：https://blog.csdn.net/xerysherryx/article/details/79034264
import Colors = require('colors.ts')
Colors.enable()
// 处理那些404不存在的
app.use(async (ctx: Koa.DefaultContext, next) => {
  // 设置ctx.state，模拟挂载用户数据效果
  ctx.state = {
    user: 'super',
    code: 200
  }
  if(parseInt(ctx.status) === 404 ){
    ctx.body = {
      code: 404,
      message: '404 NotFound'
    }
  }
  await next()
})
// 启动路由
;(async () => {
  // 在controllers中读文件涉及到异步
  await KoaControllers(app, {
    router: router, // 内部还是要使用router来实现路由绑定
    basePath: '/api', // 定义api的规则【所有接口的基础路径】
    versions: [1], // 版本
    // 存放所有控制器类，是数组
    controllers: [__dirname + '/controllers/**/*']
  })
  // 后续访问就需要 host:port/api/v1/接口地址

  // 解析request body
  app.use(koaBody({
    enableTypes: ['json', 'form', 'text'],
    multipart: true, // 是否支持 multipart-formdate 的表单
    formidable: {
      // 配置了这两项之后：文件在上传后会自动上传到指定目录下，且文件名会被加密处理，但是不便于我们后续使用，不建议.....
      // 建议方式：通过拿到文件，将文件使用读入流和写入流写入到指定的目录，还可以进行自定义名称
      // // 上传目录
      // uploadDir: path.join(__dirname, '../public/avatar'),
      // // 保留文件扩展名
      // keepExtensions: true,
      maxFileSize: 200 * 1024 * 1024 // 文件最大支持的大小
    }
  }))

  // 注册路由
  app.use(router.routes())

  // 监听端口
  app.listen(3002, () => {
    console.log(' DONE '.bg_green, 'Compiled successfully in 10ms'.green);
    console.log(`访问启动成功：`, 'http://localhost:3002'.green);
  })
})()